<?php

require_once __DIR__ . '/ControllerAbstract.php';
require_once '..' . DS . '/Models/ModelMembro.php';
require_once '..' . DS . '/Models/ModelEstado.php';
require_once '..' . DS . '/Models/ModelCidade.php';
require_once '..' . DS . '/Models/ModelSexo.php';

/**
 * Description of teste
 *
 * @author david
 */
class ControllerMembro extends ControllerAbstract {

    protected $bancodedados = [];

    public function __construct($config) {
        parent::__construct($config);
    }

    /**
     * Action principal da controller
     */
    public function principal() {

        $modelMembro = new ModelMembro();
        $membros = $modelMembro->getMembros("", "");

        $data[] = $membros;
        $data[] = "lista";

        $this->render('membro/lista', $data);
    }

    /**
     * Action cadastro
     */
    public function cadastro() {
        //busca os estados para preencher em form
        $modelEstado = new ModelEstado();
        $estados = $modelEstado->getEstados();

        // busca os sexos para preencher em form
        $modelSexo = new ModelSexo();
        $sexos = $modelSexo->getSexos();

        // adiciona os dois em um arrasy só
        $data[] = $estados;
        $data[] = $sexos;

        // renderiza a página form enviando os dados
        $this->render('membro/form', $data);
    }

    /**
     * Action cadastro
     */
    public function novo() {
        //busca os estados para preencher em form
        $modelEstado = new ModelEstado();
        $estados = $modelEstado->getEstados();

        // busca os sexos para preencher em form
        $modelSexo = new ModelSexo();
        $sexos = $modelSexo->getSexos();

        // adiciona os dois em um arrasy só
        $data[] = $estados;
        $data[] = $sexos;
        $data[] = "novo";

        // renderiza a página form enviando os dados
        $this->render('membro/form', $data);
    }

    /**
     * Carrega formulário com os dados do membro
     * @param POST
     */
    public function informacoes() {
        if (isset($_POST["codigo"]) && !empty($_POST["codigo"])) {
            $codigo = $_POST["codigo"];
        } else {
            $codigo = $_SESSION["sis_id"];
        }
        if (($codigo == $_SESSION["sis_id"]) || ($_SESSION["sis_tipo"] == 2 || $_SESSION["sis_tipo"] == 3)) {
            //busca os estados para preencher em form
            $modelEstado = new ModelEstado();
            $estados = $modelEstado->getEstados();

            // busca os sexos para preencher em form
            $modelSexo = new ModelSexo();
            $sexos = $modelSexo->getSexos();

            $modelMembro = new ModelMembro();
            $membros = $modelMembro->getMembros($codigo, "");

            $beanMembro = $membros[0];

            //busca as cidades para preencher no campo cidade
            $modelCidade = new ModelCidade();
            $cidades = $modelCidade->getCidadesByEstado($beanMembro->beanCidade->beanEstado->codigo);


            // adiciona os dois em um arrasy só
            $data[] = $estados;
            $data[] = $sexos;
            $data[] = $cidades;
            $data[] = $beanMembro;

            // renderiza a página form enviando os dados
            $this->render('membro/form', $data);
        } else {
            header("location: " . BASE_URL . "404");
        }
    }

    /**
     * Action cpf
     * retorna cpf válido
     */
    public function cpf() {

        if (isset($_POST["cpf"]) && !empty($_POST["cpf"])) {
            //verifica o cpf
            $modelMembro = new ModelMembro();
            $cpf = $modelMembro->getVerificaCPF($_POST["cpf"]);

            if ($cpf != null) {
                $resultado = 1;
            } else {
                $resultado = 0;
            }
            echo $resultado;
        }
    }

    /**
     * Controla os valores da inserção de novo membro
     * Action insert
     */
    public function insert() {

        if (isset($_POST["nome"]) && isset($_POST["cpf"]) && isset($_POST["email"]) && isset($_POST["endereco"]) && isset($_POST["bairro"]) && isset($_POST["senha"]) && isset($_POST["confirmacao"]) && isset($_POST["cidade"]) && isset($_POST["nascimento"]) && isset($_POST["sexo"])) {
            if ($_POST["senha"] == $_POST["confirmacao"]) {
                $cpf = $this->validaCPF($_POST["cpf"]);
                if ($cpf) {
                    $modelMembro = new ModelMembro();
                    $resultado = $modelMembro->setMembro($_POST["nome"], $_POST["cpf"], $_POST["endereco"], $_POST["bairro"], $_POST["cidade"], $_POST["email"], $_POST["senha"], $_POST["nascimento"], $_POST["sexo"]);

                    $_SESSION["cpf"] = $_POST["cpf"];
                    $_SESSION["email"] = $_POST["email"];
                } else {
                    $resultado = "erro";
                }
            } else {
                $resultado = "erro";
            }
        } else {
            $resultado = "erro";
        }

        if ($resultado == "erro") {
            header("location: " . BASE_URL . "membro/cadastro?erro");
        } if (isset($_SESSION["sis_tipo"]) && $_SESSION["sis_tipo"] == 2) {
            header("location: " . BASE_URL . "membro");
        } else {
            header("location: " . BASE_URL . "email/confirme");
        }
    }

    /**
     * Inseres valores no usuário na sessão
     * @param type $beanMembro
     */
    public function autentica($beanMembro) {
        $_SESSION["sis_id"] = $beanMembro->codigo;
        $_SESSION["sis_nome"] = $beanMembro->nome;
        $_SESSION["sis_tipo"] = $beanMembro->tipo;
    }

    /**
     * Action para alterar membro
     * $param POST
     */
    public function update() {
        if (isset($_POST["codigo"]) && isset($_POST["nome"]) && isset($_POST["cpf"]) && isset($_POST["endereco"]) && isset($_POST["bairro"]) && isset($_POST["cidade"]) && isset($_POST["nascimento"]) && isset($_POST["sexo"])) {
            $cpf = $this->removeCaracter($_POST["cpf"]);

            $resultado = $this->validaCPF($cpf);
            if ($resultado) {
                $modelMembro = new ModelMembro();

                $beanMembro = $modelMembro->getVerificaCPF($cpf);

                //verifica se o cpf já existe no banco de dados
                if (isset($beanMembro->codigo) && isset($beanMembro->cpf)) {

                    // verifica se o cpf que já existe é o do usuário mesmo.
                    if ($beanMembro->codigo != $_POST["codigo"]) {
                        $resultado = "erro";
                    } else {
                        $resultado = "ok";
                    }
                } else {
                    $resultado = "ok";
                }

                if ($resultado != "erro") {

                    // converte data para data americada ano/mes/dia
                    $novaData = $this->convertDataEUA($_POST["nascimento"]);

                    // se passar por todas as verificações, faz a atualização
                    $resultado = $modelMembro->setUpdateMembro($_POST["codigo"], $_POST["nome"], $cpf, $_POST["endereco"], $_POST["bairro"], $_POST["cidade"], $novaData, $_POST["sexo"]);
                }
            } else {
                $resultado = "erro";
            }
        } else {
            $resultado = "erro";
        }

        if ($resultado == "erro") {
            header("location: " . BASE_URL . "membro?erro");
        } else {
            header("location: " . BASE_URL . "membro?success");
        }
    }

    /**
     * Action para deletar membro
     * $param POST
     */
    public function delete() {
        if (isset($_POST["codigo"]) && !empty($_POST["codigo"])) {

            //exclui o membro do banco de dados
            $modelMembro = new ModelMembro();
            $resultado = $modelMembro->setDeleteMembro($_POST["codigo"]);
        } else {
            $resultado = "erro";
        }

        echo $resultado;
    }

    /**
     * 
     */
    public function ativar() {
        if (isset($_POST["codigo"]) && !empty($_POST["codigo"])) {

            $modelMembro = new ModelMembro();
            $resultado = $modelMembro->setAtivaDesativa($_POST["codigo"], 1);
        } else {
            $resultado = "erro";
        }

        echo $resultado;
    }

    /**
     * 
     */
    public function desativar() {
        if (isset($_POST["codigo"]) && !empty($_POST["codigo"])) {

            $modelMembro = new ModelMembro();
            $resultado = $modelMembro->setAtivaDesativa($_POST["codigo"], 0);
        } else {
            $resultado = "erro";
        }

        echo $resultado;
    }

    /**
     * Valida o CPF
     * @param type $cpf
     * @return boolean
     */
    public function validaCPF($cpf) {
        // determina um valor inicial para o digito $d1 e $d2
        // pra manter o respeito ;)
        $d1 = 0;
        $d2 = 0;
        // remove tudo que não seja número
        $cpf = preg_replace("/[^0-9]/", "", $cpf);
        // lista de cpf inválidos que serão ignorados
        $ignore_list = array(
            '00000000000',
            '01234567890',
            '11111111111',
            '22222222222',
            '33333333333',
            '44444444444',
            '55555555555',
            '66666666666',
            '77777777777',
            '88888888888',
            '99999999999'
        );
        // se o tamanho da string for dirente de 11 ou estiver
        // na lista de cpf ignorados já retorna false
        if (strlen($cpf) != 11 || in_array($cpf, $ignore_list)) {
            return false;
        } else {
            // inicia o processo para achar o primeiro
            // número verificador usando os primeiros 9 dígitos
            for ($i = 0; $i < 9; $i++) {
                // inicialmente $d1 vale zero e é somando.
                // O loop passa por todos os 9 dígitos iniciais
                $d1 += $cpf[$i] * (10 - $i);
            }
            // acha o resto da divisão da soma acima por 11
            $r1 = $d1 % 11;
            // se $r1 maior que 1 retorna 11 menos $r1 se não
            // retona o valor zero para $d1
            $d1 = ($r1 > 1) ? (11 - $r1) : 0;
            // inicia o processo para achar o segundo
            // número verificador usando os primeiros 9 dígitos
            for ($i = 0; $i < 9; $i++) {
                // inicialmente $d2 vale zero e é somando.
                // O loop passa por todos os 9 dígitos iniciais
                $d2 += $cpf[$i] * (11 - $i);
            }
            // $r2 será o resto da soma do cpf mais $d1 vezes 2
            // dividido por 11
            $r2 = ($d2 + ($d1 * 2)) % 11;
            // se $r2 mair que 1 retorna 11 menos $r2 se não
            // retorna o valor zeroa para $d2
            $d2 = ($r2 > 1) ? (11 - $r2) : 0;
            // retona true se os dois últimos dígitos do cpf
            // forem igual a concatenação de $d1 e $d2 e se não
            // deve retornar false.
            return (substr($cpf, -2) == $d1 . $d2) ? true : false;
        }
    }

    /**
     * Retorna a quantidade de membros inativos
     */
    public function notific() {
        $modelMembro = new ModelMembro();
        $notifics = $modelMembro->getInativos();

        echo $notifics;
    }

    /**
     * 
     */
    public function inativos() {
        $modelMembro = new ModelMembro();
        $inativos = $modelMembro->getMembros("", "inactive");

        $this->render("membro/inativos", $inativos);
    }

    /**
     * Remove os caracteres do CPF
     * @param type $cpf
     * @return string
     */
    public function removeCaracter($cpf) {
        $explode = explode(".", $cpf);
        $explode = $explode[0] . $explode[1] . $explode[2];
        $explode = explode("-", $explode);
        $explode = $explode[0] . $explode[1];

        return $explode;
    }

    /**
     * Converte a data para YYYY-mm-dd
     * @param type $data
     * @return type
     */
    public function convertDataEUA($data) {
        $desmonta = explode("/", $data);
        $dia = $desmonta[0];
        $mes = $desmonta[1];
        $ano = $desmonta[2];

        return $ano . "-" . $mes . "-" . $dia;
    }

}
